"""运算符的概述"""
from builtins import print

"""
一、什么是运算符
    运算符是一种特殊的符号。通过运算符对相应数据类型的这运算数进行运算。
    例如:加法运算符+可用于将两个整数类型的运算数进行相加的运算,比如3+5;
    布尔运算符and可用于将两个布尔类型的运算数进行逻辑与的运算,比如True and False。
"""

"""
二、
常见的运算符
1.标准算术运算符
2.取余运算符
3.幂运算符
4.布尔运算符
5.比较运算符
6.赋值运算符
"""

#标准算术运算符
# + 、-、*、/
def stand_yunsuan():
    print("标准运算")
    print(2 + 5)
    print(5 - 2)
    print(2 * 5)
    print(2 / 5)

#整数除 // 整数除运算符//用于计算一个数值是另一个数值的多少倍。
def zhengshuchu():
    print(9 // 4)
    # 9 = （-4） * （-3） + （-3） 余数在 -4 ~ 0之间
    print(9 // -4) #-3
# stand_yunsuan()
# zhengshuchu()

"""
    取余运算符 %
    a % b = a - b * 倍数 = a - b * (a // b) = 余数
"""
def quyu():
    print(9 % 4)  # 1
    print(9 % -4) # -3
    print(-9 % 4) # 3
# quyu()


"""
    幂运算
"""
def miyunsuan():
    print(3 ** 2)
    print(pow(3,  2))
# miyunsuan()


"""
    布尔运算and、or、not
"""
def buer():
    print(not True)
    print(not False)
# buer()


"""
赋值运算符
=号左边是变量，=号右边是对象，变量
"""
def fuzhi():
    a = 18
    print(a)
    #不推荐
    a = 'Hello'
    print(a)

#链式赋值
    a = b = c =18
    print(a, b, c)

    #参数赋值
    a = 3
    a += 5
    print(a)

"""

一、什么是比较运算符
    比较运算符用于比较两个运算数,比较结果是一个布尔值。
    比较运算符包括如下几个:
1. <
2. <=
3. >
4.>=
5.==
    == 用于比较两个运算数是否相等,也就是说,==用于"相等性"测试
6. !=
7. is
    is用于比较两个运算数是否是同一个对象,也就是说,is用于"同一性"测试。
8. is not
"""
def bijiao():
    print(6 < 8)   #True
    print(6 <= 8)#True
    print(8 > 6)#True
    print(8 >= 6)#True
    print(8 == 8.0)#True
    print(8 != 8)#False

    #列表
    a = b = [1, 2, 3]
    c = [1 ,2, 3]

    print(a == b) #True
    print(a == c) #True

    print(a is b) #True
    print(a is c) #False

    #不可变类型对象的is比较
    #对于不可变类型的对象, 其内存可能会被重用, 比如数值较小的整数对象。
    #可以调用内置函数id进行验证。内置函数id甲于返回对象的唯一标识(对象在内存中的地址)。

    a = 18
    b = 18
    print(id(a))
    print(id(b))

    print(a is b) # True

    #链式比较
    age = 18
    print(0 < age < 100) # True 相当于 print(0 < age and age < 100)
#bijiao()


"""
    关键字和标识符
    >>> help()
    Welcome to Python 3.10's help utility!
    and                 del                 import              return
    as                  elif                in                  try
    assert              else                is                  while
    async               except              lambda              with
    await               finally             nonlocal            yield
    break               for                 not

    通过导入模块keyword查看所有关键字：
    >>> import keyword
    >>> keyword.kwlist
    标识符区分大小写，不能是关键字，不能以数字开头，不能包含空格，制表符，数学符号，中划线，箭头等
"""
import keyword
def key_words():
    print(keyword.kwlist)

"""
对象None
一、什么是对象None
    对象None用于表示数据值的不存在。
    对象None是占据一定的内存空间的,它并不意味着"空"或"没有定义",
    也就是说,None是"something",而不是"nothing"
"""
def nonee():
    print(id(None)) #140731700177648
    # 使用场景
    # 对象None经常用于变量的初始化,或将变量重置为"数据值不不存在"的状态。

    a = None
    print(a) #None

    b = 18
    print(b) # 18
    b = None
    print(b) #None
# nonee()

"""
    序列类型range
    range是一种序列类型,range类型用于表示不可变的整数序列。
    可以调用内置函数range(类range的构造方法)创建range类型的对象,有三种调用方式:
1. range(stop)
2. range(start,stop)
3. range(start, stop, step)

其中,整数序列的起始值的默认值是0,可以使用参数start指定。
可以使用参数stop指定整数序列的结束值;创建的range对象不包含stop。
整数序列的步长的默认值是1,可以使用参数step进行指定。

    内置函数range的返回值是一个迭代器对象。为了清楚地表示返回的迭代器对象所表示的整数序列,可以将其转换成列表。
    range类型的优点在于:不管range对象表示的整数序列有多长,所所有range对象占用的内存空间
都是相同的,因为仅仅需要存储start、stop和step。只有当用到range对象时,才会去计算序列中的
相关元素。
"""

def range_xulie():
    print(range(10))#range(0, 10)
    print(list(range(10))) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    print(list(range(1,5))) #[1, 2, 3, 4]

    print(list(range(0,20,4)))#[0, 4, 8, 12, 16]
    print(list(range(0,-20,-4)))#[0, -4, -8, -12, -

#可以使用运算符in(not in)检查range对象表示的整数序列中是否存在(不存在)指定的整数。
    print(3 in range(5)) #True
    print(8 not in range(5)) #True
range_xulie()

if __name__ == '__main__':
    print(' ')